package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.heima.common.dto.PageResponseResult;
import com.heima.common.dto.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.user.dto.AuthDto;
import com.heima.user.entity.ApAuthor;
import com.heima.user.entity.ApUser;
import com.heima.user.entity.ApUserRealname;
import com.heima.user.entity.WmUser;
import com.heima.user.feign.ArticleFegin;
import com.heima.user.feign.MediaFegin;
import com.heima.user.mapper.ApUserRealnameMapper;
import com.heima.user.service.IApUserRealnameService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.user.service.IApUserService;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * <p>
 * APP实名认证信息表 服务实现类
 * </p>
 *
 * @author mcm
 * @since 2022-06-20
 */
@Service
public class ApUserRealnameServiceImpl extends ServiceImpl<ApUserRealnameMapper, ApUserRealname> implements IApUserRealnameService {

    @Override
    public ResponseResult listByStatus(AuthDto dto) {
        IPage<ApUserRealname> page=new Page<>(dto.getPage(),dto.getSize());
        LambdaQueryWrapper<ApUserRealname> query=new LambdaQueryWrapper<>();
//        先判断需要查询的状态码判断查询
        if(dto.getStatus()!=null){
            query.eq(ApUserRealname::getStatus,dto.getStatus());

        }

        IPage<ApUserRealname> iPage = this.page(page, query);
        PageResponseResult responseResult=new PageResponseResult(dto.getPage(),dto.getSize(),
                iPage.getTotal(),iPage.getRecords());

        return responseResult;
    }
    @Autowired
    private IApUserService userService;

    @Override
//    开启事务的注解
    @GlobalTransactional
    public ResponseResult auth(AuthDto authDto, int i) {
        System.out.println(i);
//        先根据前端的数据里的用户认证表id查询用户认证的信息
        ApUserRealname userRealname = this.getById(authDto.getId());
//        然后根据状态判断拒绝还是通过 1 通过 0 失败
        if(i==0){
//            失败了就得修改状态并且写理由 2是不通过
            userRealname.setStatus(2);
            userRealname.setReason(authDto.getReason());
            this.updateById(userRealname);
            return ResponseResult.okResult();
        }
//        如果审核成功  （注册两个表 一个是自媒体表 ，作者表）
//        根据用户认证id查询用户注册表信息的id
        ApUser apUser= userService.getById(userRealname.getUserId());
//创建自媒体账号
       WmUser wmUser =createWmUser(apUser);
//       判断为不为空
        if(wmUser!=null){
//            创建一个作者账号
            ApAuthor apAuthor= createApAuthor(apUser,wmUser);
//            再继续判断是否为空
//            不为空的需要修改用户认证表的状态
            if(apAuthor!=null){
//                9 是审核通过
                userRealname.setStatus(9);
                this.updateById(userRealname);
//                修改用户信息中的身份  1为自媒体人

                apUser.setFlag(1);
                userService.updateById(apUser);

            }

        }


        return ResponseResult.okResult();
    }
//    创建一个作者账号

    private ApAuthor createApAuthor(ApUser apUser, WmUser wmUser) {
        ApAuthor apAuthor=new ApAuthor();
        apAuthor.setName(apUser.getName());
        apAuthor.setUserId(apUser.getId());
        apAuthor.setWmUserId(wmUser.getId());
        apAuthor.setType(2);
        ResponseResult<ApAuthor> apAuthorResponseResult = articleFegin.saveApAuthor(apAuthor);
        if(apAuthorResponseResult.getCode().equals(AppHttpCodeEnum.SUCCESS.getCode())){
            ApAuthor data = apAuthorResponseResult.getData();
            if(data!=null){
                wmUser.setApAuthorId(apAuthor.getId());
                mediaFegin.updateWmUser(wmUser);
            }
            return apAuthor;

        }
        return null;
    }

    //    两个远程调用
//    远程调用自媒体账号的创建和修改的方法
    @Autowired
    private MediaFegin mediaFegin;
//    远程调用作者账号的创建和删除的方法
    @Autowired
    private ArticleFegin articleFegin;
//    创建一个自媒体账号

    private WmUser createWmUser(ApUser apUser) {
//       先将用户注册信息copy给自媒体用户表
        WmUser wmUser=new WmUser();
        BeanUtils.copyProperties(apUser,wmUser);
//        把id置空表里是自增的
        wmUser.setId(null);
        wmUser.setApUserId(apUser.getId());
        wmUser.setNickname(apUser.getName());
        wmUser.setStatus(9);
        wmUser.setType(0);
//        0 个人 1 企业 2 子账号
        ResponseResult<WmUser> saveWmUser = mediaFegin.saveWmUser(wmUser);
        if(saveWmUser.getCode().equals(AppHttpCodeEnum.SUCCESS.getCode())){
            WmUser user = saveWmUser.getData();
            return user;
        }
            return null;

    }
}
